# 对yaml文件里面需要替换的数据进行替换
# 替换之前需要进行提取
import copy
import re
import yaml
from jsonpath import jsonpath

from utils.extend_utils import ExtendUtils
from utils.handle_yaml import read_testcase_info, write_var

ext = ExtendUtils()


class ExtractUtil:  # 提取、替换的工具类

    # 提取响应信息里面的内容   并写入  env_vars.yaml文件
    def extract_var(self, var_name, res, attr, exp, index):
        """
        :param var_name: 提取出来给到哪个变量
        :param res:  从哪个响应信息里面提取数据
        :param attr:  从响应的哪个属性里面进行提取  status_code   json  text
        :param exp:  提取方式的表达式，jsonpath,正则表达式
        :param index:  下标    提取出来的数据是一个列表，需要的是列表的第几个数据
        :return:
        """
        res = copy.deepcopy(res)
        try:
            res.json = res.json()
        except:
            pass
        attr_value = getattr(res, attr)  # 获取响应信息对应的属性
        if exp.startswith("$"):  # 如果表达式是$符号开头的，就是认为他是jsonpath进行提取的
            value_list = jsonpath(attr_value, exp)
        else:
            value_list = re.findall(exp, str(attr_value))
        # var_dict = dict(var_name=value_list[index])
        var_value = value_list[index]
        var_dict = {}
        var_dict[var_name] = var_value
        write_var(var_dict)

    # 替换  ${方法名称(参数)}
    def exchange_var(self, dict_1):
        # 转成字符串，再去进行替换
        yam_str = yaml.safe_dump(dict_1, allow_unicode=True)  # allow_unicode=True防止中文乱码
        yam_str = self.call_python_func(yam_str)
        yaml_dict = yaml.safe_load(yam_str)
        return yaml_dict

    # 查找需要替换的数据，并且进行替换
    def call_python_func(self, str_1):
        # "${read_vars(token111)}"
        exp = "\\$\\{(.*?)\\((.*?)\\)\\}"
        res_list = re.findall(exp, str_1)  # [(),(),()]
        for i in res_list:
            # print(i)
            func = i[0]
            param = i[1].split(",")
            res = getattr(ext, func)(*param)
            # print(res)
            old_value = "${" + func + "(" + i[1] + ")" + "}"
            str_1 = str_1.replace(old_value, str(res))
        return str_1


if __name__ == '__main__':
    # eu = ExtractUtil()
    # eu.exchange_var(r"D:\Deyunce\python代码\接口框架\test_case\02_cart_list.yaml")

    a = dict(name="文君")
    print(a)
